import type { EventLog } from 'web3';

export interface TransferEvent extends EventLog {
    returnValues: {
        from: string;
        to: string;
        tokenId: bigint;
    };
}

export const erc721Abi = [
    {
        'constant': true,
        'inputs': [{ 'name': '_tokenId', 'type': 'uint256' }],
        'name': 'ownerOf',
        'outputs': [{ 'name': 'owner', 'type': 'address' }],
        'type': 'function',
    },
    {
        'constant': true,
        'inputs': [
            {
                'name': 'interfaceId',
                'type': 'bytes4',
            },
        ],
        'name': 'supportsInterface',
        'outputs': [
            {
                'name': '',
                'type': 'bool',
            },
        ],
        'payable': false,
        'stateMutability': 'view',
        'type': 'function',
    },
    {
        'constant': true,
        'inputs': [{ 'name': '_tokenId', 'type': 'uint256' }],
        'name': 'tokenURI',
        'outputs': [{ 'name': '', 'type': 'string' }],
        'type': 'function',
    },
    {
        'constant': true,
        'inputs': [{ 'name': 'owner', 'type': 'address' }],
        'name': 'balanceOf',
        'outputs': [{ 'name': 'balance', 'type': 'uint256' }],
        'type': 'function',
    },
    {
        'anonymous': false,
        'inputs': [
            {
                'indexed': true,
                'name': 'from',
                'type': 'address',
            },
            {
                'indexed': true,
                'name': 'to',
                'type': 'address',
            },
            {
                'indexed': true,
                'name': 'tokenId',
                'type': 'uint256',
            },
        ],
        'name': 'Transfer',
        'type': 'event',
    },
    {
        'constant': false,
        'inputs': [
            {
                'name': '_to',
                'type': 'address',
            },
            {
                'name': '_tokenId',
                'type': 'uint256',
            },
        ],
        'name': 'approve',
        'outputs': [],
        'type': 'function',
    },
    {
        'constant': false,
        'inputs': [
            {
                'name': '_operator',
                'type': 'address',
            },
            {
                'name': '_approved',
                'type': 'bool',
            },
        ],
        'name': 'setApprovalForAll',
        'outputs': [],
        'type': 'function',
    },
    {
        'constant': true,
        'inputs': [
            {
                'name': '_tokenId',
                'type': 'uint256',
            },
        ],
        'name': 'getApproved',
        'outputs': [
            {
                'name': '',
                'type': 'address',
            },
        ],
        'payable': false,
        'stateMutability': 'view',
        'type': 'function',
    },
    {
        'constant': true,
        'inputs': [
            {
                'name': '_owner',
                'type': 'address',
            },
            {
                'name': '_operator',
                'type': 'address',
            },
        ],
        'name': 'isApprovedForAll',
        'outputs': [
            {
                'name': '',
                'type': 'bool',
            },
        ],
        'payable': false,
        'stateMutability': 'view',
        'type': 'function',
    },
];

export const brokerABI = [
    {
        'inputs': [
            {
                'internalType': 'address',
                'name': 'initialOwner',
                'type': 'address',
            },
        ],
        'stateMutability': 'nonpayable',
        'type': 'constructor',
    },
    {
        'inputs': [],
        'name': 'AccountMustParticipate',
        'type': 'error',
    },
    {
        'inputs': [],
        'name': 'OfferMustExist',
        'type': 'error',
    },
    {
        'inputs': [],
        'name': 'OfferMustNotExecuted',
        'type': 'error',
    },
    {
        'inputs': [
            {
                'internalType': 'address',
                'name': 'owner',
                'type': 'address',
            },
        ],
        'name': 'OwnableInvalidOwner',
        'type': 'error',
    },
    {
        'inputs': [
            {
                'internalType': 'address',
                'name': 'account',
                'type': 'address',
            },
        ],
        'name': 'OwnableUnauthorizedAccount',
        'type': 'error',
    },
    {
        'anonymous': false,
        'inputs': [
            {
                'indexed': true,
                'internalType': 'address',
                'name': 'previousOwner',
                'type': 'address',
            },
            {
                'indexed': true,
                'internalType': 'address',
                'name': 'newOwner',
                'type': 'address',
            },
        ],
        'name': 'OwnershipTransferred',
        'type': 'event',
    },
    {
        'inputs': [
            {
                'internalType': 'address',
                'name': 'account',
                'type': 'address',
            },
            {
                'internalType': 'uint256',
                'name': 'offerID',
                'type': 'uint256',
            },
        ],
        'name': '_isParticipating',
        'outputs': [
            {
                'internalType': 'bool',
                'name': '',
                'type': 'bool',
            },
        ],
        'stateMutability': 'view',
        'type': 'function',
    },
    {
        'inputs': [
            {
                'components': [
                    {
                        'internalType': 'address',
                        'name': 'nftAddr',
                        'type': 'address',
                    },
                    {
                        'internalType': 'uint256',
                        'name': 'tokenID',
                        'type': 'uint256',
                    },
                ],
                'internalType': 'struct Item[]',
                'name': 'items',
                'type': 'tuple[]',
            },
            {
                'internalType': 'uint256',
                'name': 'offerID',
                'type': 'uint256',
            },
        ],
        'name': 'confirm',
        'outputs': [],
        'stateMutability': 'nonpayable',
        'type': 'function',
    },
    {
        'inputs': [
            {
                'internalType': 'address',
                'name': 'recipient',
                'type': 'address',
            },
            {
                'internalType': 'string',
                'name': 'name',
                'type': 'string',
            },
        ],
        'name': 'createOffer',
        'outputs': [
            {
                'internalType': 'uint256',
                'name': 'offerID',
                'type': 'uint256',
            },
        ],
        'stateMutability': 'nonpayable',
        'type': 'function',
    },
    {
        'inputs': [
            {
                'internalType': 'uint256',
                'name': 'offerID',
                'type': 'uint256',
            },
        ],
        'name': 'getName',
        'outputs': [
            {
                'internalType': 'string',
                'name': '',
                'type': 'string',
            },
        ],
        'stateMutability': 'view',
        'type': 'function',
    },
    {
        'inputs': [],
        'name': 'getOffers',
        'outputs': [
            {
                'components': [
                    {
                        'internalType': 'uint256',
                        'name': 'id',
                        'type': 'uint256',
                    },
                    {
                        'internalType': 'string',
                        'name': 'name',
                        'type': 'string',
                    },
                    {
                        'components': [
                            {
                                'internalType': 'address',
                                'name': 'account',
                                'type': 'address',
                            },
                            {
                                'internalType': 'bool',
                                'name': 'confirmation',
                                'type': 'bool',
                            },
                            {
                                'components': [
                                    {
                                        'internalType': 'address',
                                        'name': 'nftAddr',
                                        'type': 'address',
                                    },
                                    {
                                        'internalType': 'uint256',
                                        'name': 'tokenID',
                                        'type': 'uint256',
                                    },
                                ],
                                'internalType': 'struct Item[]',
                                'name': 'items',
                                'type': 'tuple[]',
                            },
                        ],
                        'internalType': 'struct Trader',
                        'name': 'initiator',
                        'type': 'tuple',
                    },
                    {
                        'components': [
                            {
                                'internalType': 'address',
                                'name': 'account',
                                'type': 'address',
                            },
                            {
                                'internalType': 'bool',
                                'name': 'confirmation',
                                'type': 'bool',
                            },
                            {
                                'components': [
                                    {
                                        'internalType': 'address',
                                        'name': 'nftAddr',
                                        'type': 'address',
                                    },
                                    {
                                        'internalType': 'uint256',
                                        'name': 'tokenID',
                                        'type': 'uint256',
                                    },
                                ],
                                'internalType': 'struct Item[]',
                                'name': 'items',
                                'type': 'tuple[]',
                            },
                        ],
                        'internalType': 'struct Trader',
                        'name': 'recipient',
                        'type': 'tuple',
                    },
                    {
                        'internalType': 'bool',
                        'name': 'executed',
                        'type': 'bool',
                    },
                ],
                'internalType': 'struct Offer[]',
                'name': '',
                'type': 'tuple[]',
            },
        ],
        'stateMutability': 'view',
        'type': 'function',
    },
    {
        'inputs': [
            {
                'internalType': 'uint256',
                'name': 'offerID',
                'type': 'uint256',
            },
        ],
        'name': 'isConfirmed',
        'outputs': [
            {
                'internalType': 'bool',
                'name': '',
                'type': 'bool',
            },
        ],
        'stateMutability': 'view',
        'type': 'function',
    },
    {
        'inputs': [
            {
                'internalType': 'uint256',
                'name': 'offerID',
                'type': 'uint256',
            },
        ],
        'name': 'isExecuted',
        'outputs': [
            {
                'internalType': 'bool',
                'name': '',
                'type': 'bool',
            },
        ],
        'stateMutability': 'view',
        'type': 'function',
    },
    {
        'inputs': [
            {
                'internalType': 'address',
                'name': '',
                'type': 'address',
            },
            {
                'internalType': 'address',
                'name': '',
                'type': 'address',
            },
            {
                'internalType': 'uint256',
                'name': '',
                'type': 'uint256',
            },
            {
                'internalType': 'bytes',
                'name': '',
                'type': 'bytes',
            },
        ],
        'name': 'onERC721Received',
        'outputs': [
            {
                'internalType': 'bytes4',
                'name': '',
                'type': 'bytes4',
            },
        ],
        'stateMutability': 'nonpayable',
        'type': 'function',
    },
    {
        'inputs': [],
        'name': 'owner',
        'outputs': [
            {
                'internalType': 'address',
                'name': '',
                'type': 'address',
            },
        ],
        'stateMutability': 'view',
        'type': 'function',
    },
    {
        'inputs': [
            {
                'internalType': 'uint256',
                'name': 'offerID',
                'type': 'uint256',
            },
        ],
        'name': 'reject',
        'outputs': [],
        'stateMutability': 'nonpayable',
        'type': 'function',
    },
    {
        'inputs': [],
        'name': 'renounceOwnership',
        'outputs': [],
        'stateMutability': 'nonpayable',
        'type': 'function',
    },
    {
        'inputs': [
            {
                'internalType': 'address',
                'name': 'newOwner',
                'type': 'address',
            },
        ],
        'name': 'transferOwnership',
        'outputs': [],
        'stateMutability': 'nonpayable',
        'type': 'function',
    },
    {
        'constant': false,
        'inputs': [
            {
                'name': '_to',
                'type': 'address',
            },
            {
                'name': '_tokenId',
                'type': 'uint256',
            },
        ],
        'name': 'approve',
        'outputs': [],
        'type': 'function',
    },
    {
        'constant': false,
        'inputs': [
            {
                'name': '_operator',
                'type': 'address',
            },
            {
                'name': '_approved',
                'type': 'bool',
            },
        ],
        'name': 'setApprovalForAll',
        'outputs': [],
        'type': 'function',
    },
];